현재 위키 편집 화면의 기능과 구현 위치를 정리한다.
app/views/Wiki/edit.scala.html - 편집 화면 마크업, 툴바, CodeMirror 스타일, AhaWikiEditConfigpublic/js/Wiki/edit.page.js - 편집 화면의 대부분의 클라이언트 동작public/js/AhaWiki.Editor.js - 입력 보조 규칙과 CodeMirror/textarea 공통 keydown 처리public/js/AhaWiki.CodeMirror.AhaMark.js - AhaMark용 CodeMirror modepublic/js/Wiki/edit.hotkeyAlt.js - 편집 화면 Alt 단축키 dispatcherpublic/js/Wiki/edit.divider.js - editor/preview 컬럼 divider drag resizepublic/js/AhaWiki.WikipediaToSchema.js - Wikipedia InfoBox를 Schema 블록으로 변환Word Wrap 체크박스는 CodeMirror의 lineWrapping 옵션을 토글한다.CodeMirror 5를 사용하며 mode 이름은 ahamark이다.
현재 하이라이트 대상:
=, ==, ..., ======----[[[#!...]]]와 블록 내부#!...[Page], [Page Alias], URL[[Macro(...)]]{{name}}[YYYY-MM-DD], [YYYY-MM-DD YYYY-MM-DDTHH:mm:ss]inline Copied!!Style class:
ahamark-interpreter - [[[#!...]]] interpreter blockahamark-interpreter-shebang - #!... directive lineAhaWiki.Editor는 CodeMirror와 textarea 모두에 같은 입력 규칙을 적용한다.
(), {}, [], "", '', `Backspace는 비어 있는 matching pair를 함께 삭제한다.Enter는 현재 줄이 list이면 list prefix를 다음 줄로 이어준다.Tab은 list line에서는 indent/outdent, 일반 위치에서는 tab 문자를 삽입한다.--[ 입력 흐름에서는 현재 날짜/시간 link를 만든다.[[ / [[[ 주변 입력은 interpreter/block wrapper 작성을 돕는다.Process로 들어오는 경우를 보정한다.자동완성 popup은 CodeMirror cursor 위치 또는 textarea 위치 기준으로 표시한다.
지원 context:
[[Ma - macro name[Pa 또는 ["Pa - page name[[[#!Ta - interpreter name[[[#!table ts - table option[[[#!Schema Pe - schema.org class[[[#!Schema Person 블록 내부 property line - schema.org propertySource API:
GET /api/macroNamesGET /api/interpreterNamesGET /api/pageNamesGET /api/schemaClassNamesGET /api/schemaPropertyNames동작:
ArrowUp / ArrowDown으로 선택을 이동한다.Enter / Tab으로 선택 항목을 적용한다.Escape, blur, editor 외부 click/scroll에서 popup을 닫는다.MacroName()을 삽입하고 cursor를 괄호 안에 둔다.POST /preview로 미리보기를 갱신한다.name, text, lineStart, lineEnd를 함께 보낸다..previewPane에 넣은 뒤 Mermaid 초기화를 수행한다..pageOverflow class를 붙인다.data-line-start / data-line-end를 이용해 대응 위치로 scroll한다.previewSyncBlink animation을 적용한다.편집 URL에 lineStart와 lineEnd가 있으면 해당 line range만 editor에 넣는다.
Partial edit에서 #!table block을 감지하면 raw editor 대신 inline table editor를 사용할 수 있다.
tsv, csv, tsv 1, tsv 1 1, tsv 1 1 tablesorter option 자동완성주의:
편집 화면에서 현재 page의 attachment를 조회하고 관리한다.
GET /api/pageAttachments로 기존 첨부 목록을 읽는다.POST /api/uploadAttachment에 multipart upload한다.POST /api/uploadClipboardImage에 multipart upload한다.[[Attachment(...)]] macro를 cursor 위치에 삽입한다.POST /api/deleteAttachment를 호출한다.integrityStatus가 S3_ONLY인 항목은 insert/delete action을 숨긴다.InfoBox 버튼은 Wikipedia page name을 입력받아 en, ko Wikipedia에서 infobox를 조회한다.
[[[#!Schema ... ]]] block으로 삽입한다.# API URL과 sameAs 값을 함께 넣는다.comment는 필수 입력이다.minorEdit 체크박스를 지원한다.saveSenderId를 hidden field에 넣어 WebSocket page update broadcast에서 자기 tab의 저장 알림을 제외한다.오류 처리:
403 - permission denied409 - revision conflict400 body == latestText - 변경 없는 저장편집 화면에서는 Alt와 다음 key 조합으로 toolbar action을 실행한다.
Alt W - Word WrapAlt I - InfoBoxAlt A - AttachAlt C - revision comment input focusAlt M - Minor editAlt S - SaveAlt R - RenameAlt T - Delete문단마다 붙는 편집 링크는 logics.wikis.PartialEdit 한 곳에서 만듭니다.
revision — 지금 보고 있는 리비전. 쿼리스트링이 우선입니다. 옛 리비전을 보는 중이라면 편집 링크도 그 리비전을 가리켜야 하기 때문입니다. 링크에 리비전을 실어 두는 덕에, 문단을 열어 둔 사이 페이지가 바뀌면 저장 시점에 알아챌 수 있습니다.editUrl — /w/{페이지}?action=edit&revision=N&lineStart=N&lineEnd=N이 둘이 인터프리터 블록용(ExtractConvertInjectInterpreter)과 제목용(InterpreterWiki)에 각각 한 벌씩, 글자 하나 다르지 않게 있었습니다. 두 렌더러는 페이지를 나누는 방식이 달라서 따로 있는 게 맞지만, **링크 모양은 달라질 수 없는 것** 입니다.
Similar pages by cosine similarity. Words after page name are term frequency.